import {getDependNameOfComponent} from '../generates/depends' ;
import {IExecute} from './iexecute';


/**
 * 获取可执行方法（带依赖检测）
 */
export class DepCheckExecute implements IExecute {

    public jquery:JQueryStatic;
    /**
     * 执行依赖方法时，需要获取依赖组件的列表
     */
    public deps:any;
    /**
     * 不支持destroy方法的组件
     */
    public noSupportDestroy:Array<string>;

    constructor(jquery:JQueryStatic){
        this.jquery = jquery;
        this.deps={
            'combo':{
                'textbox': 'textbox'
            },
            'combogrid': {
                'datagrid': 'grid'
            },
            'combotreegrid':{
                'treegrid': 'grid'
            },
            'combotree':{
                'tree': 'tree'
            },
            'datagrid':{
                'panel': 'getPanel',
                'pagination': 'getPager'
            },
            'datetimebox':{
                'spinner': 'spinner'
            },
            'datebox':{
                'calendar': 'calendar'
            },
            'searchbox':{
                'textbox': 'textbox',
                'menu': 'menu'
            }
        }
        this.noSupportDestroy= ['layout'];
    }

    /**
     * 获取可执行方法（带依赖检测）
     */
    execute(compName: string, methodName: string, $dom:JQuery, args:Array<any>) {
        if(methodName == 'destroy' && this.noSupportDestroy.find((item)=>{ return item == compName; })){
            return;
        }
        //have bug: 如我执行分页的select方法，很有可能会调用linkbutton的select。依赖组件之间有重名方法时，有问题
        let depCompName = getDependNameOfComponent(compName, methodName, this.deps[compName], this.jquery);
        if(depCompName && depCompName != compName && this.deps[compName]){
            //依赖上的
            var depHandler = $dom[compName].apply($dom, [this.deps[compName][depCompName]]);
            let $depDom = this.jquery(depHandler[0]);
            return depHandler[depCompName].apply($depDom, args);
        } 
        return $dom[compName].apply($dom, args);  
    }
}